package com.ztr.elasticsearch;

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.json.JSONObject;

import java.io.IOException;

public class ElasticsearchSearchExample {
    private final RestHighLevelClient client;

    public ElasticsearchSearchExample(RestHighLevelClient client) {
        this.client = client;
    }

    /**
     * 根据指定的ID在索引中进行搜索。
     *
     * @param indexName 要搜索的索引名称。
     * @param id        要搜索的文档ID。
     * @return 如果找到匹配的文档，则返回该文档的_source字段作为JSON字符串；如果没有找到，则返回一条提示信息。
     * @throws IOException 如果在发送搜索请求时发生IO错误。
     */
    public String searchById(String indexName, String id) throws IOException {
        // 创建搜索请求，并指定索引名称
        SearchRequest searchRequest = new SearchRequest(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 设置查询条件，查询特定的_id字段匹配指定的id
        searchSourceBuilder.query(QueryBuilders.matchQuery("_id", id));
        // 只加载_source字段，忽略其他字段以节省带宽
        searchSourceBuilder.fetchSource(new FetchSourceContext(true, new String[]{}, new String[]{}));
        searchRequest.source(searchSourceBuilder);

        // 发送搜索请求并接收响应
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        // 检查是否有匹配的文档
        if (searchResponse.getHits().getHits().length > 0) {
            // 获取第一个匹配文档的_source字段，并转换为JSON字符串返回
            String sourceAsString = searchResponse.getHits().getHits()[0].getSourceAsString();
            return sourceAsString;
        } else {
            // 如果没有找到匹配的文档，则返回提示信息
            return "No hits found for the given ID.";
        }
    }


    /**
     * 主函数入口
     *
     * @param args 命令行参数
     * @throws IOException 如果发生I/O错误
     */
    public static void main(String[] args) throws IOException {
        // 初始化RestHighLevelClient，配置Elasticsearch集群的连接
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("192.168.195.128", 9200, "http")));

        ElasticsearchSearchExample example = new ElasticsearchSearchExample(client);
        String indexName = "liush";  // 指定索引名称
        String id = "1";  // 指定文档ID
        // 通过ID搜索文档，并返回JSON格式的结果
        String jsonData = example.searchById(indexName, id);
        System.out.println(jsonData);

        JSONObject jsonObject = new JSONObject(jsonData);
        // 从JSON对象中提取"title"字段的值
        String title = jsonObject.getString("title");
        // 打印提取的"title"字段的值
        System.out.println("Title: " + title);
        // 关闭Elasticsearch客户端连接
        client.close();
    }

}